class observer{
    constructor(data){
        this.walk(data)
    }
    walk(data){
        //判断data是否是对象
        if(!data || typeof data !=="object"){
            return
        }
        //遍历data所有属性
        Object.keys(data).forEach(key => {
           this.defineReactive(data, key, data[key]) 
        });
    }
    defineReactive(obj , key, val){
        //如果val 是对象  把val的属性转换成响应式
        let that=this;
        //负责收集依赖，并发送通知
        let dep=new Dep()
        this.walk(val)
        Object.defineProperty(obj,key,{
            enumerable:true,
            configurable:true,
            get(){
                //收集依赖
                Dep.target && dep.addSub(Dep.target)
                return val
            },
            set(newVal){
                if(newVal==val){
                    return
                }
                val=newVal
                that.walk(newVal)
                //发送通知
                dep.notify()
            }
        
        })
    }
}